package 代码coding题OR模拟题;
import java.util.ArrayDeque;
import java.util.Deque;
/**
 * 判断两个 字符串 是否相等 别用  ==  
 * 判断 引用 数据 类型  都别用 ==   
 * 这样 会出问题的 说实话  
 * @author I adore you
 *
 *这个 题 就是 一个  coding 题 
 *可以 考虑  一下 优化  
 *你发现 这个 使用栈 的 一些 缺点了 没 主要          是在   执行加号      “ + ”  运算的时候 这个 stack  就越明显 
 */
public class leetcode682棒球比赛 {
	
/**
 * 	 optimise  优化
 * @param ops
 * @return
 * 这个 代码 就非常的  妙  
 * 根据 输入 数据 范围 边界的    最大值 来设置 nums 数组的 大小 而只加载 一次  这样 再处理 下一次 数据 输入 还是这个  数组 
 * 这样 就  非常的 节约时间 
 * 
 * public class MainClass {
    public static String[] stringToStringArray(String line) {
        JsonArray jsonArray = JsonArray.readFrom(line);
        String[] arr = new String[jsonArray.size()];
        for (int i = 0; i < arr.length; i++) {
          arr[i] = jsonArray.get(i).asString();
        }
        return arr;
    }
    
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while ((line = in.readLine()) != null) {
            String[] ops = stringToStringArray(line);
            
  ***          int ret = new Solution().calPoints(ops);              ****
            
            String out = String.valueOf(ret);
            
            System.out.print(out);
        }
    }
}
 注意 标注 星号 的 那一行代码 是很重要的       每次 都 是 new  那我 直接 来个 static 只 加载 一次 岂不是  妙哉
 * 
 */
	static  int nums[]  = new int [1001];
	public static int optimiseSolution(String ops[]) {
		int index = 0;
		int ans = 0;
		for(int i = 0;i < ops.length;i++,index++) {
			if(ops[i].equals("+")) {
				nums[index] = nums[index-1] + nums[index-2];
			}
			else if(ops[i].equals("C")) {
				/**
				 * 这里 为啥 要  -2  明白吧 
				 * C  是 使 前一个 无效 应该   -1 
				 * 但是 你注意 index++  的位置 是在  和 i++ 在一块的 所以 需要 -2
				 * 
				 */
				index -= 2;
			}
			else if(ops[i].equals("D")) {
				nums[index] = nums[index - 1] * 2;
			}
			else {
				nums[index] = Integer.parseInt(ops[i]);
			}
		}
		for(int i = 0;i < index;i++) {
			ans += nums[i];
		}
		return ans;
	}

	
	public static void main(String []args) {
		String ops []={"5","-2","4","C","D","9","+","+"};
		System.out.println(solution(ops));
		System.out.println(optimiseSolution(ops));
	}
	
	
	
	public static int solution(String ops[]) {
		Deque<Integer> stack = new ArrayDeque<>();
		int op1=0,op2=0;
		for(int i= 0;i < ops.length;i++) {
			if(ops[i].equals( "+")) {
				op1 = stack.pollLast();
				op2 = stack.peekLast();
				stack.add(op1);
				stack.addLast(op1+op2);
			}
			/**
			 *   这里  有个 严谨的  东西存在 就是 
			 *   他妈 这里 的 字符串  在 leetcode 的判断  两个 字符串 用      ==  居然  会出问题的 
			 */
			else if(ops[i].equals("D")) {
				stack.add(stack.peekLast() * 2);
			}
			else if(ops[i].equals("C")) {
				stack.pollLast();
			}
			else
				stack.add(Integer.parseInt(ops[i]));
		}
		int sum =0;
		for(int i : stack) {
//			System.out.println(i);
			sum += i;
		}
		return sum;
	}
	
}
